import java.io.*;
public class ej26 {

	public static void main(String[] args) throws IOException{
		
		final int caracteres = 100; //Número máximo de carácteres Romanos
		
		int i,j,k,contador,acumulado=0;
		int contadorV=0, contadorL=0, contadorD=0; //Contadores para evaluar la correción del número romano escrito
		char entradaC[];
		boolean romano = false;
		int valores[] = new int [caracteres];/*Vector de enteros que almacenará
											los valores de cada carácter según la
											equivalencia de los nºs romanos
											*/
		String entrada;//String donde se almacenará lo introducido por teclado
		
		InputStreamReader teclado; //Declaro la entrada de datos
		BufferedReader bufferLectura;//Declaro Buffer de entrada
		
		teclado = new InputStreamReader (System.in);//Paso al InputStreamReader la entrada de teclado 
		bufferLectura = new BufferedReader (teclado);//Se almacena en el buffer
		
		
		/* LECTURA DE ROMANOS:
		 * Pido un número Romano, compruebo que sea romano o sino lo vuelvo a pedir
		 * para ello, hago que se repita la lectura de teclado mientras no lo
		 * considere "numero romano" es decir, mientras romano!=true, romano sera
		 * cierto, cuando todos los carácteres sean alguno de los carácteres romanos
		 * (I,V,X,C,D ó M) para ello, cada vez que compruebe un número le sumará 1
		 * al contador si se considera romano, después comparará el valor del
		 * contador con la longitud de la cadena, si es igual es que todos los
		 * carácteres son números romanos, por lo que dará por válida la cadena
		 */
		do{
			System.out.print("Introduzca el Número Romano: ");
			entrada = bufferLectura.readLine().toUpperCase();	/*Convierte automáticamente
																  el buffer de lectura a 	
																mayúsculas para facilitar
																las comparaciones ya que sólo
																hay que tener en cuenta las
																mayúsculas independientemente
																de cómo se haya introducido la
																cadena										
																*/
			contador=0;  //Inicializa el contador de carácteres a 0 que luego se usará
						// para comprobar que se haya introducido un número romano de tipos
						//de carácteres correctos (letras soportadas) se añade la "L"
//		Convierto el String en un ARRAY de carácteres
			entradaC = new char [entrada.length()];
			for(i=0;i<entrada.length();i++){
				entradaC[i] = entrada.charAt(i);   //Se ha añadido la letra L por ser también un número romano aunque no apareciese en el enunciado del problema
				if(entradaC[i]=='I'||entradaC[i]=='V'||entradaC[i]=='X'||entradaC[i]=='L'||entradaC[i]=='C'||entradaC[i]=='D'||entradaC[i]=='M'){
					contador++;					
				}
				if(contador==entrada.length())
					romano = true;
			}
			for(i=3;i<entrada.length();i++){   //Este for genera un error si introduces más de 3 valores iguales seguidos y 
											//	en ese caso te obliga a reintroducir el número romano (romano = false;)
				if (entradaC[i]==entradaC[i-1]&&entradaC[i-1]==entradaC[i-2]&&entradaC[i-2]==entradaC[i-3]){
					romano = false;
					System.out.println("\tERORR: No puedes poner más de 3 Símbolos iguales seguidos");
				}
			
			}
			/*Otra regla para escribir números romanos, dice que no pueden repetirse
			 * las letras V, L, y D, puesto que las letras X, C, y M representan
			 * sus valores duplicados respectivamente
			 * Implementamos ésta regla con sus For correspondientes que generen
			 * los errores para V, L y D
			 */	
			for(i=0;i<entrada.length();i++){
				if(entradaC[i]=='V')
					contadorV++;
				if(entradaC[i]=='L')
					contadorL++;
				if(entradaC[i]=='D')
					contadorD++;
			}
			if (contadorV<=1||contadorL<=1||contadorD<=1);
					//Si alguno se repite, entonces el número sería falso
			else if (contadorV>1||contadorL>1||contadorD>1){
				romano = false;
				System.out.println("\tERROR: Aparece más de una vez V ó L ó D");
				contadorV=0;//Después de un error resetea los valores a su defecto
				contadorL=0;
				contadorD=0;
			}
			
			
			
		}
		while(romano!=true); /*Este do-while comprueba que los números romanos sean
								correctos, mientras no lo sean te seguirá pidiendo
								que vuelvas a introducir una cadena*/
		
		//FIN DE LECTURA DE ROMANOS
		
		
		/*CONVERSIÓN DE ROMANOS
		 * Traduzco el vector de carácteres, a un vector de números, cuyos valores
		 * van a ser los correspondientes a los números romanos, por ejemplo el
		 * caracter 'I' será el valor 1.
		 */
		
		for(i=0;i<contador;i++){
			if (entradaC[i]=='I')
				valores[i]=1;
			else if (entradaC[i]=='V')
				valores[i]=5;
			else if (entradaC[i]=='X')
				valores[i]=10;
			else if (entradaC[i]=='C')
				valores[i]=100;
			else if (entradaC[i]=='L') //He añadido éste valor aunque en el enunciado 
				valores[i]=50;		   //no apareciera, ya que forma parte de los nºs Romanos
			else if (entradaC[i]=='D')
				valores[i]=500;
			else if (entradaC[i]=='M')
				valores[i]=1000;
		}
		
		
		//Resta de números más pequeños.
		for(i=0;i<=contador;){
			if (valores[i]<valores[i+1]){
				valores[i+1]=valores[i+1]-valores[i];
				valores[i]=0;
			}
			else if(valores[i]==valores[i+1]&&valores[i]!=0){
			
				valores[i+1]=valores[i+1]+valores[i];
				valores[i]=0;	
			}
			else if(valores[i]==0)
				i++; /*Sólo aumenta la posición si al examinar en el vector de números, no realiza ninguna
						operación o había un 0, ya que si ha realizado una operación, al reordenar, volverá a ocupar la posición
						anterior y la vacante sería un 0.*/
			else
				i++;
			
//			Reordena, quitando los 0's
			for(k=0;k<=contador;k++)        //Estos "for" reordena los valores, tiene que ser después
				for(j=0;j<=contador;j++){   //de realizar cada operación, dentro del for, puesto que si se hace fuera
					if(valores[j]==0){	 //no se podrían encadenar varias restas seguidas.
						valores[j]=valores[j+1];
						valores[j+1]=0;
					}
				}
			}
		
		/*SUMA
		 * 
		 * Una vez hechas todas las restas necesarias, simplemente suma los valores
		 * restantes
		 */
		
		for(i=0;i<=contador;i++){
			acumulado+=valores[i];
		}
		System.out.println();
		System.out.print("El Número Romano ");
		for(i=0;i<contador;i++)
			System.out.print(entradaC[i]);
		System.out.println();
		System.out.print("Tiene un valor de "+acumulado);
		

	}

}
